<?php
/**
 * 类库文件
 * @author Monkee
 * @version zhuopang v1.0
 * @copyright (c) 2011, Monkee
 */
/**
 *  Mysql数据库操作类
 *
 * @author monkee
 */
class DB {
    /**
     * 执行sql语句
     * @param string $sql 执行的sql语句
     * @return mixed 执行结果
     */
    static public function query($sql){
        $obj = & self::getObject();
        $q = $obj->query($sql);
        if($q === FALSE){
            self::debug($sql);
        }
        return $q;
    }
    
    /**
     * 执行插入操作
     * @param string $table 要插入的表
     * @param mixed $data 要插入的数据
     * @param string $replace 是否使用replace插入
     * @return int 新插入的ID
     */
    static public function insert($table, $data, $replace = false){
        $obj = & self::getObject();
        $query = $replace ? 'REPLACE' : 'INSERT';
        $keys = $items = array();
        foreach($data as $key => $item){
            $keys[] = $key;
            $items[] = self::escape_string($item);
        }
		
        $query .= ' INTO '.self::table($table).' ('.implode(',',$keys).') VALUES ("'.implode('","',$items).'")';
        self::query($query);
        return $obj->insert_id;
    }
    
    /**
     * 执行插入操作
     * @param string $table 要插入的表
     * @param array $keys 要插入的keys顺序
     * @param array $data 要插入的数据 array(array('key1'=>'value','key2'=>'value'),array('key1'=>'value','key2'=>'value'));
     * @param string $replace 是否使用replace插入
     * @return int 影响到的条数
     */
    static public function insertMult($table, $keys, $data, $replace = false){
        $obj = & self::getObject();
        $query = $replace ? 'REPLACE' : 'INSERT';
        $items = array();
        foreach($data as $i){
            $its = array();
            foreach($keys as $key){
                $its[] = '"'.self::escape_string($i[$key]).'"';
            }
            $items[] = '("'.implode('","', $its).'")';
        }
        $query .= ' INTO '.self::table($table).' "('.implode(',',$keys).')" VALUES ("'.implode('","',$items).'")';
        self::query($query);
        return $obj->affected_rows();
    }
    
    /**
     * 执行更新操作
     * 
     * @param string $table 要插入的表名
     * @param array $data 要更新的数据
     * @param string $condition 筛选条件
     * @return int 影响到的条数
     */
    static public function update($table, $data, $condition = ''){
        $obj = & self::getObject();
        $query = 'UPDATE '.self::table($table).' set ';
        $querys = array();
        foreach($data as $key => $item){
            $querys[] = '`'.$key.'` = "'.self::escape_string($item).'"';
        }
        $query .= implode(',',$querys).' WHERE ';
        $query .= empty($condition) ? '1' : $condition;
        self::query($query);
        return $obj->affected_rows;
    }
    
    /**
     * 执行数据库删除操作
     *
     * @param string $table 表名
     * @param string $condition 条件
     * @return int 有效的记录数
     */
    static public function delete($table, $condition = ''){
        $obj = & self::getObject();
        $query = 'DELETE FROM '.self::table($table).' WHERE ';
        $query .= empty($condition) ? '1' : $condition;
        self::query($query);
        return $obj->affected_rows;
    }
    
    /**
     * 通过执行sql获取多条数据
     *
     * @param string $sql 执行语句
     * @return array 数据
     */
    static public function fetchArray($sql){
        $obj = & self::getObject();
        $q = self::query($sql);
        $r = array();
        while($r[] = $q->fetch_assoc()) ;
        $q->free();
        array_pop($r);
        return $r;
    }
    
    /**
     * 通过执行sql获取单条数据
     *
     * @param string $sql 执行语句
     * @return array 数据
     */
    static public function fetchOne($sql){
        $obj = & self::getObject();
        $q = self::query($sql);
        $r = $q->fetch_assoc();
        $q->free();
        return $r;
    }
    
    /**
     * 数据库表加前缀
     * @param string $table 表名
     * @return string 加前缀后的表名
     */
    static public function table($table){
        return MYSQL_TABLE_PRE.$table;
    }
    
    /**
     * 对sql中的一些字符转义，保证输入的安全
     * @param string $str 要转义的字符串
     * @return string 转义后的字符串
     */
    static public function escape_string($str){
        $obj = & self::getObject();
        return $obj->real_escape_string($str);
    }
    
    /**
     * 特定字段的值增加一个固定的值，默认为1
     * 
     * @param string $table
     * @param string $column
     * @param int $num
     */
    static public function columnAdd($table, $column, $condition = 1, $num = 1){
    	$obj = & self::getObject();
    	return $obj->query('UPDATE '.DB::table($table)." SET {$column} = {$column} + {$num} WHERE {$condition}");
    }
    /**
     * 私有类，返回执行的mysql句柄
     * @param 无
     * @return object object(mysql) Mysql句柄
     */
    static public function & getObject(){
        static $obj = null;
        if( $obj === null ){
            $obj = new mysqli(MYSQL_HOST, MYSQL_USER, MYSQL_PW, MYSQL_DB);
            $obj->set_charset("utf8");
			//
        }
        return $obj;
    }
    
    /**
     * 调试信息
     * 若为调试模式 输出调试信息
     * 否则直接输出内部错误
     *
     * @param string $sql sql语句
     * @return void 无
     */
    static public function debug($sql = ''){
        $obj = & self::getObject();
        exit("Mysql error:".$obj->error."\nerrno:".$obj->errno."\nsql:".$sql);
    }
    
    static public function test(){
    	$sql = "SHOW VARIABLES LIKE '%olla%'";
    	$row = self::fetchArray($sql);
    	print_r($row);
    }
}
?>